#include <iostream>

// 单例：一个类只能创建一个对象（写一个单例的步骤：1、构造函数私有化；2、准备一个静态局部变量和一个静态函数，返回这个函数的对象）
// 模板单例：以后所有的类只要继承自这个模板，就自动变成一个单例，就不需要写单例了

template <typename T>
class Singleton
{
public:
    static T &getinstance()
    {
        static T instance;
        return instance;
    }

// 构造函数保护化
protected:
    Singleton() {}
};

// 奇异递归（CRTP）：继承的类模板的模板参数是类本身
class Student : public Singleton<Student>
{
public:
    Student() {}
};

int main()
{
    Student::getinstance();
    return 0;
}